package com.util.orm.service;

import com.util.common.QueryList;
import com.util.common.QueryParam;

import java.io.Serializable;
import java.util.List;

/**
 * Base Service
 * @param <E>
 * @param <PK>
 */
public interface BaseService<E,PK extends Serializable> {
	/**
	 * 根据主键查询
	 * @param id
	 * @return
	 * @
	 */
	public E getObjectById(PK id) ;
	
	/**
	 * 根据某个非主键查询单条记录
	 * @return
	 * @
	 */
	public E getUniqueByParam(String statementName, Serializable param) ;
	
	
	/**
	 * 
	 * 查询总数
	 * @return
	 */
	public Long getCount(Object param);
	
	/**
	 * 查询总数
	 * @param statementName
	 * @param param
	 * @return
	 */
	public Long getCount(String statementName, Object param);
	
	/**
	 * 根据主键删除
	 * @param id
	 * @return
	 * @
	 */
	public int deleteObjectById(PK id) ;
	
	/**
	 * 插入数据
	 * @param entity
	 * @return
	 * @
	 */
	public int saveObject(E entity) ;

	
	/**
	 * 更新数据
	 * @param entity
	 * @return
	 * @
	 */
	public int update(String statementName, E entity) ;
	
	/**
	 * 根据sqlId更新数据
	 * @param entity
	 * @return
	 * @
	 */
	public int update(E entity) ;


	/**
	 * 查询
	 * @param param
	 * @return
	 */
	public List<E> selectList(Object param);
	
	/**
	 * 查询,指定statementName
	 * @param statementName
	 * @param param
	 * @return
	 */
	public List<E> selectList(String statementName, Object param);
	
	/**
	 * 分页查询, 指定可分页查询条件
	 * @return
	 */
	public QueryList<E> selectPage(QueryParam pageParam);
	
	/**
	 * 分页查询, 指定特定sqlId语句，指定可分页查询条件
	 * @param sqlId
	 * @param pageParam
	 * @param otherParam
	 * @return
	 */
	public QueryList<E> selectPage(String sqlId, QueryParam pageParam, Object otherParam);
	
	
	/**
	 * 启动批量模式
	 * @
	 */
	void startBatch()  ;
	
	/**
	 * 释放暂存的批量更新操作，但不提交事务。
	 * 如果数据量特别大，中途可以多次执行此操作
	 * @return 
	 * @
	 */
	int flushBatch()  ;
	/**
	 * 执行批量提交，但不提交事务，事务由容器提交。
	 * 最后一次提交批量操作。
	 * @
	 */
	void executeBatch()  ;
	
	/**
	 * 执行批量提交，且提交事务。
	 * 最后一次提交批量操作。
	 * @
	 */
	void executeBatch(boolean commitTx)  ;

	void cancelBatch();

	void cancelBatch(boolean commitTx);
}
